home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Vault: The Gold Collection
/
Software Vault - The Gold Collection (American Databankers) (1993).ISO
/
cdr28
/
charon40.zip
/
SRC
/
CALLBACK.H
next >
Wrap
C/C++ Source or Header
|
1993-03-01
|
4KB
|
131 lines
/* callback.h - define callback functions for loadable modules */
#ifndef _CALLBACK_H
#define _CALLBACK_H
/*
A loadable module is a 'C' source program which has been
compiled under BC or TC using tiny model with -r save regs.
bcc -mt -r source.c
link source.obj,source.exe,source.map, cs.lib
rem note that c0t.obj is NOT linked in
exe2bin source.exe source.bin
copy source.bin sys:usr\charon\spool
Tiny model programs have only one segment, DS=CS=SS
The data segment is composed of static initialized data
and unititialized data (BSS).
Charon runs multiple copies of the module by generating a unique
data/stack area, and using a shared code segment.
Each instance of the module has its own stack and BSS data, but
shares the static data.
Therefore, if you intend to keep 'local' data that persists between
callbacks, you must store it a) on the stack, or b) in unitialized
data.
The module's context is switched during every callback (ala windows).
If you want to share a writable variable between all instances, be sure
that it is not located within the last paragraph of the static data
segment, as the BSS area is rounded down to the previous paragraph.
Therefore up to 15 bytes of static data may not actually be common
between instances. This amount is called the `Pump Size' and can
be determined using the Object Information Display of Charon.
This .h file provides the defines and mechanisms to allow the
module creator to test the module as a stand-alone program, conversion
to a module involves recompiling with a #define set.
Callbacks are achieved by defining a few common functions that
provide I/O for the module.
The '_start' procedure must be the first procedure defined
in the executable file. You may have other procedures, but they
must be defined after _start.
the definition for _start is
int _start(argc, char *argv[], struct NXlate far *callptr)
where callptr is a far ptr to a data item that must be returned
in all callbacks.
The callback.c module includes a definition for _start which
calls a main(int argc, char *argv[]) function...
Before including this module, you must #define a setting to
indicate if the program will be a module, or standalone.
#define STANDALONE 0 compile as module
#define STANDALONE 1 compile as standalone program
*/
#define STDIN 0
#define STDOUT 1
#define STDERR 2
#define CB_READ 0
#define CB_WRITE 1
#define CB_GETENV 2
#define CB_SETENV 3
#define CB_TELLP 4
#define CB_SEEKP 5
#define CB_MAXCALLS 5
/* define valid return codes, OR them together optional returncode in lower byte */
#define RT_CHANGED_TEXT 0x4000 /* the output file was updated */
#define RT_CHANGED_TAGS 0x2000 /* the file attribute tags were changed */
#define RT_FAILED 0x1000 /* I couldn't translate this file */
#define RT_OK 0x0800 /* I did what I could and I finished ok */
#define MAX_STRING 256
#ifndef MASTER_SOURCE
#ifndef STANDALONE
#error You must define the STANDALONE def
#endif
#if !defined(__TINY__)
#error You must compile in the tiny model only
#endif
#if defined(__OVERLAY__)
#error You must not compile with overlays
#endif
int read(int handle, char *buffer, int count); /* returns bytes read */
int write(int handle, char *buffer, int count); /* returns bytes written */
char *getenv(char *string);
#if STANDALONE
#define tellp(handle) lseek(handle,0L,1)
#define setenv(s) putenv(s)
#else
void setenv(char *string);
long tellp(int handle);
#endif
long seekp(int handle, long offset, int whence);
int fprintf(int handle, char *format, ...);
#ifndef SEEK_CUR
#define SEEK_CUR 1
#define SEEK_END 2
#define SEEK_SET 0
#endif
#endif
#endif